# Copyright 2021 The SuningBank
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#auth 16080951
import re
import xml.etree.ElementTree as ET
from utils import *

class HTProcess:
    def __init__(self):
        self.data = {}
        self.util = Util()

    # 解析读取到的文件数据
    def processSinglePage(self, fileNameNoKZ,pages):
        util = self.util
        self.data = {}
        title = []
        element = []
        dealCode = ['成交单号']
        nhinfo = ['买入方信息机构', '买入方信息交易员', '买入方信息交易员ID', '买入方信息电话', '买入方信息传真', '买入方信息法定代表人', '买入方信息机构地址']
        zhinfo = ['卖出方信息机构', '卖出方信息交易员', '卖出方信息交易员ID', '卖出方信息电话', '卖出方信息传真', '卖出方信息法定代表人', '卖出方信息机构地址']
        cjinfo = ['票面总额(元)', '票据类别', '应付利息(元)', '票据介质', '结算金额(元)', '结算日', '交易利率',
                  '结算方式', '收益率', '清算类型', '加权平均剩余期限', '最晚结算时间','票据张数']
        cjinfonh = ['买入方账户信息支付系统行名', '买入方账户信息支付系统行号', '买入方账户信息资金账户名称', '买入方账户信息资金账号', '买入方账户信息托管账户名称',
                    '买入方账户信息托管账号']
        cjinfozh = ['卖出方账户信息支付系统行名', '卖出购方账户信息支付系统行号', '卖出购方账户信息资金账户名称', '卖出购方账户信息资金账号', '卖出购方账户信息托管账户名称',
                    '卖出购方账户信息托管账号']

        title.extend(dealCode)
        title.extend(nhinfo)
        title.extend(zhinfo)
        title.extend(cjinfo)
        title.extend(cjinfonh)
        title.extend(cjinfozh)
        self.data['title'] = title
        self.data['element'] = element
        self.data['element'].clear()


        # 每页取出，将页面中的数据进行解析。
        for xml in pages:

            tree = ET.parse(xml)
            # 每页中的关键数据进行提取
            glyphs = tree.findall(".//{http://schemas.microsoft.com/xps/2005/06}Glyphs")
            # 结构化数据变量
            glyphsUnicodeArry = []
            appendData = []
            for glyphsData in glyphs:
                glyphsUnicodeArry.append(glyphsData.attrib['UnicodeString'])
            # example
            #票据转贴现成交单|成交时间：|2021-05-27 16:17:38|上海票据交易所|成交单编号：|TD20210527003197|
            # 买入方信息|机构|德阳农村商业银行股份有限公司|交易员|杨颖|交易员|ID|180021|电话|0838-2903372
            # |传真|0838-2550500|法定代表人或负责人|张文斌|机构地址|德阳市庐山南路一段168号|卖出方信息|
            # 机构|江苏苏宁银行股份有限公司|交易员|卢嘉成|交易员|ID|19050805|电话|无|传真|025-66996699|
            # 法定代表人或负责人|黄金老|机构地址|南京市建邺区45号地块金融城4号楼707室|成交信息|票面总额(元)|
            # 15,000,000.00|应付利息(元)|346,937.50|结算金额(元)|14,653,062.50|交易利率|2.7300|%|收益率|
            # 2.7946|%|加权平均剩余期限|305|天|票据张数|2|买入方账户信息|支付系统行名|德阳农村商业银行股份有限公司|
            # 支付系统行号|314658000012|资金账户名称|德阳农村商业银行股份有限公司|资金账号|1124|托管账户名称|
            # 德阳农村商业银行托管账户|托管账号|C121015555100004091700|票据类别|银票|票据介质|电票|结算日|2021-05-27|
            # 结算方式|票款对付（|DVP）|清算类型|全额|最晚结算时间|17:15:00|卖出方账户信息|支付系统行名|
            # 江苏苏宁银行股份有限公司|支付系统行号|323301000019|资金账户名称|待支付清算款项|-|即时转账借记来|账|
            # 资金账号|188018016304400001|托管账户名称|江苏苏宁银行托管账户|托管账号|C121027143200009145800|
            # *交易合同一方违约，违约方应根据双方约定向对方承担违约责任。
            excelData = "|".join(glyphsUnicodeArry)
            excelData = excelData.replace('|电话|传真|', '|电话|无|传真|')
            excelData = excelData.replace('|传真|法定代表人', '|传真|无|法定代表人')

            # ========================票据转帖现成交单信息===============================================
            # 成交单号
            dealCode =util.toStr(re.findall(r'成交单编号：\|(.*?)\|买入方信息', excelData))
            # 正/逆回购方信息
            grgName = re.findall(r'机构\|(.*?)\|交易员', excelData)
            # 交易员
            trader = re.findall(r'交易员\|(.*?)\|交易员\|ID', excelData)
            # 交易员ID
            traderId = re.findall(r'交易员\|ID\|(.*?)\|电话', excelData)

            # 正回电话
            sqPhone = util.toStr(re.findall(r'卖出方信息\|.*?电话\|(.*?)\|传真', excelData))
            # 逆回电话
            isqPhone = util.toStr(re.findall(r'买入方信息\|.*?电话\|(.*?)\|传真', excelData))
            # 正回传真
            sqFax = util.toStr(re.findall(r'卖出方信息\|.*?传真\|(.*?)\|法定代表人或负责人', excelData))
            # 逆回传真
            isqFax = util.toStr(re.findall(r'买入方信息\|.*?传真\|(.*?)\|法定代表人或负责人', excelData))
            # 正/逆法定人
            legalPerson = re.findall(r'法定代表人或负责人\|(.*?)\|机构地址', excelData)

            # 正向地址
            sqAddress = util.toStr(re.findall(r'卖出方信息\|.*?机构地址\|(.*?)\|成交信息', excelData))
            # 逆向地址
            isqAddress = util.toStr(re.findall(r'买入方信息\|.*?机构地址\|(.*?)\|卖出方信息', excelData))

            #['买入方信息机构', '买入方信息交易员', '买入方信息交易员ID', '买入方信息电话', '买入方信息传真', '买入方信息法定代表人', '买入方信息机构地址']

            appendData.append(dealCode)
            appendData.append(grgName[0])
            appendData.append(trader[0])
            appendData.append(traderId[0])
            appendData.append(isqPhone)
            appendData.append(isqFax)
            appendData.append(legalPerson[0])
            appendData.append(isqAddress)

            #zhinfo = ['卖出方信息机构', '卖出方信息交易员', '卖出方信息交易员ID', '卖出方信息电话', '卖出方信息传真', '卖出方信息法定代表人', '卖出方信息机构地址']

            appendData.append(grgName[1])
            appendData.append(trader[1])
            appendData.append(traderId[1])
            appendData.append(sqPhone)
            appendData.append(sqFax)
            appendData.append(legalPerson[1])
            appendData.append(sqAddress)

            # ========================成交信息===============================================
            # 票面总额
            fvTotal = util.toStr(re.findall(r'票面总额\(元\)\|(.*?)\|应付利息\(元\)', excelData))
            # 应付利息
            interestPayable = util.toStr(re.findall(r'应付利息\(元\)\|(.*?)\|结算金额\(元\)', excelData))
            # 结算金额
            settlementAmount = util.toStr(re.findall(r'结算金额\(元\)\|(.*?)\|交易利率', excelData))
            # 交易利率
            jySettlementAmount = util.toStr(re.findall(r'交易利率\|(.*?)\|收益率', excelData))
            # 收益率
            repurchaseSettlementAmount = util.toStr(re.findall(r'收益率\|(.*?)\|加权平均剩余期限', excelData))
            # 加权平均剩余期限
            repoRate = util.toStr(re.findall(r'加权平均剩余期限\|(.*?)\|票据张数', excelData))
            # 票据张数
            tickNum = util.toStr(re.findall(r'票据张数\|(.*?)\|买入方账户信息', excelData))



            # 票据类别|银票|票据介质|电票|结算日|2021-05-27|
            # 结算方式|票款对付（|DVP）|清算类型|全额|最晚结算时间|17:15:00
            # 票据类别
            billCategory = util.toStr(re.findall(r'票据类别\|(.*?)\|票据介质', excelData))
            # 票据介质
            billMedium = util.toStr(re.findall(r'票据介质\|(.*?)\|结算日', excelData))
            # 结算日
            firstSettlementDate = util.toStr(re.findall(r'结算日\|(.*?)\|结算方式', excelData))
            # 结算方式
            settlementType = util.toStr(re.findall(r'结算方式\|(.*?)\|清算类型', excelData))
            # 清算类型
            liquidationType = util.toStr(re.findall(r'清算类型\|(.*?)\|最晚结算时间', excelData))
            # 最晚结算时间
            lastSettlementDate = util.toStr(re.findall(r'最晚结算时间\|(.*?)\|', excelData))

            #cjinfo = ['票面总额(元)', '票据类别', '应付利息(元)', '票据介质', '结算金额(元)', '结算日', '交易利率',
            #          '结算方式', '收益率', '清算类型', '加权平均剩余期限', '最晚结算时间', '票据张数']

            appendData.append(fvTotal)
            appendData.append(billCategory)
            appendData.append(interestPayable)
            appendData.append(billMedium)
            appendData.append(settlementAmount)
            appendData.append(firstSettlementDate)
            appendData.append(jySettlementAmount)
            appendData.append(settlementType)
            appendData.append(repurchaseSettlementAmount)
            appendData.append(liquidationType)
            appendData.append(repoRate)
            appendData.append(lastSettlementDate)
            appendData.append(tickNum)

            # ========================正逆信息===============================================
            # 正回购方账户信息 支付系统行名
            sqAccountBankName =util.toStr(re.findall(r'卖出方账户信息\|.*?支付系统行名\|(.*?)\|支付系统行号', excelData))
            # 正回购方账户信息 支付系统行号
            sqAccountBankNo =util.toStr(re.findall(r'卖出方账户信息\|.*?支付系统行号\|(.*?)\|资金账户名称', excelData))
            # 正回购方账户信息 资金账户名称
            sqAccountName =util.toStr(re.findall(r'卖出方账户信息\|.*?资金账户名称\|(.*?)\|资金账号', excelData))
            # 正回购方账户信息 资金账号
            sqAccountNo =util.toStr(re.findall(r'卖出方账户信息\|.*?资金账号\|(.*?)\|托管账户名称', excelData))
            # 正回购方账户信息 托管账户名称
            sqTGAccountName =util.toStr(re.findall(r'卖出方账户信息\|.*?托管账户名称\|(.*?)\|托管账号', excelData))
            # 正回购方账户信息 托管账号
            sqTGNo =util.toStr(re.findall(r'卖出方账户信息\|.*?托管账号\|(.*?)\|', excelData))

            isqAccountBankName =util.toStr(re.findall(r'买入方账户信息\|.*?支付系统行名\|(.*?)\|支付系统行号', excelData))
            # 逆回购方账户信息 支付系统行号
            isqAccountBankNo =util.toStr(re.findall(r'买入方账户信息\|.*?支付系统行号\|(.*?)\|资金账户名称', excelData))
            # 逆回购方账户信息 资金账户名称
            isqAccountName =util.toStr(re.findall(r'买入方账户信息\|.*?资金账户名称\|(.*?)\|资金账号', excelData))
            # 逆回购方账户信息 资金账号
            isqAccountNo =util.toStr(re.findall(r'买入方账户信息\|.*?资金账号\|(.*?)\|托管账户名称', excelData))
            # 逆回购方账户信息 托管账户名称
            isqTGAccountName =util.toStr(re.findall(r'买入方账户信息\|.*?托管账户名称\|(.*?)\|托管账号', excelData))
            # 逆回购方账户信息 托管账号
            isqTGNo =util.toStr(re.findall(r'买入方账户信息\|.*?托管账号\|(.*?)\|票据类别', excelData))

            # cjinfonh = ['逆回购方账户信息支付系统行名', '逆回购方账户信息支付系统行号', '逆回购方账户信息资金账户名称', '逆回购方账户信息资金账号', '逆回购方账户信息托管账户名称',
            #            '逆回购方账户信息托管账号']

            appendData.append(isqAccountBankName)
            appendData.append(isqAccountBankNo)
            appendData.append(isqAccountName)
            appendData.append(isqAccountNo)
            appendData.append(isqTGAccountName)
            appendData.append(isqTGNo)

            # cjinfozh = ['正回购方账户信息支付系统行名', '正回购方账户信息支付系统行号', '正回购方账户信息资金账户名称', '正回购方账户信息资金账号', '正回购方账户信息托管账户名称',
            #            '正回购方账户信息托管账号']
            appendData.append(sqAccountBankName)
            appendData.append(sqAccountBankNo)
            appendData.append(sqAccountName)
            appendData.append(sqAccountNo)
            appendData.append(sqTGAccountName)
            appendData.append(sqTGNo)
            self.data['element'].append(appendData)

        # 处理数据done
        util.doExcel(self.data['element'],self.data['title'],fileNameNoKZ)

    def destory(self):
        self.data.clear()


